From 4394401748e2892710d641ec3e73a63aecf6d6d9 Mon Sep 17 00:00:00 2001 From: Jan Beulich Date: Wed, 26 Sep 2012 17:11:39 +0200 Subject: [PATCH] x86: default-disable MWAIT-based idle driver for CPUs without ARAT Without ARAT, and apparently only when using HPET broadcast mode as replacement, CPUs occasionally fail to wake up, causing the system to (transiently) hang. Until the reason is understood, disable the driver on such systems. Signed-off-by: Jan Beulich Acked-by: Keir Fraser --- xen/arch/x86/cpu/mwait-idle.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/xen/arch/x86/cpu/mwait-idle.c b/xen/arch/x86/cpu/mwait-idle.c index 6a9ca95d33..e8b26e4ec8 100644 --- a/xen/arch/x86/cpu/mwait-idle.c +++ b/xen/arch/x86/cpu/mwait-idle.c @@ -71,7 +71,7 @@ # define pr_debug(fmt...) #endif -static __initdata bool_t no_mwait_idle; +static __initdata s8 no_mwait_idle = -1; invbool_param("mwait-idle", no_mwait_idle); static unsigned int mwait_substates; @@ -500,6 +500,13 @@ int __init mwait_idle_init(struct notifier_block *nfb) if (pm_idle_save) return -ENODEV; + /* XXX The no-ARAT case is supposedly being taken care of, but at + * least some systems without ARAT hang for some reason, apparently + * only when using HPET broadcast mode (PIT broadcast mode seems to + * be fine). */ + if (no_mwait_idle < 0 && boot_cpu_has(X86_FEATURE_ARAT)) + no_mwait_idle = 0; + err = mwait_idle_probe(); if (!err) { if (!boot_cpu_has(X86_FEATURE_ARAT)) -- 2.30.2